import traceback
from loguru import logger as loguru_logger
import sys
import os
import yaml


def load_log_config_from_yaml(config_path='app.yaml'):
    """
    直接从YAML文件中加载日志配置。

    参数:
        config_path (str): 配置文件的路径，默认值为'app.yaml'。

    返回:
        dict: 日志配置字典。
    """
    try:
        with open(config_path, 'r') as config_file:
            config_data = yaml.safe_load(config_file)
            return config_data.get('log', {})
    except (FileNotFoundError, yaml.YAMLError) as exc:
        loguru_logger.error(f"读取配置文件 {config_path} 时发生错误! Error: {exc}")
        return {}


def setup_logging_from_config(config_path='app.yaml'):
    """
    基于配置文件设置日志记录。

    参数:
        config_path (str): 配置文件的路径，默认值为'app.yaml'。
    """

    # 从配置文件加载日志配置
    script_dir = os.path.dirname(os.path.abspath(__file__))
    config_file_path = os.path.join(script_dir[:-10], 'configs', config_path)
    # log_config = load_log_config_from_yaml(config_file_path)

    # 获取配置文件中的日志配置项
    log_enable = True  # 是否启用日志
    log_level = 'DEBUG'  # 日志级别
    log_folder = './pyLog'  # 日志文件夹路径
    log_retention_days = 90 # 保留天数

    # 移除Loguru的默认日志处理器
    loguru_logger.remove()
    # 设置Loguru的日志级别
    loguru_logger.level(log_level)

    # 如果启用日志，设置日志文件输出
    if log_enable:
        # 如果日志文件夹不存在，则创建
        os.makedirs(log_folder, exist_ok=True)
        # 设置日志文件路径
        log_file_path = os.path.join(log_folder, '{time:YYYY-MM-DD}.log')
        # 将日志文件处理器添加到Loguru的logger
        loguru_logger.add(log_file_path, rotation="00:00", retention=log_retention_days, level=log_level)

    # 添加控制台输出处理器以实时显示日志
    loguru_logger.add(sys.stdout, level=log_level, diagnose=True, backtrace=True)


def global_exception_handler(type, value, tb):
    """
    全局异常处理函数。当应用中出现未捕获的异常时，该函数将被调用。

    参数:
        type (Type[BaseException]): 异常类型。
        value (BaseException): 异常实例。
        tb (TracebackType): 异常回溯。
    """
    tb_str = ''.join(traceback.format_exception(type, value, tb))
    loguru_logger.error("Uncaught exception:\n" + tb_str)


# 设置全局异常处理函数
sys.excepthook = global_exception_handler

# 根据配置文件初始化日志设置
setup_logging_from_config()

# 将配置后的logger导出供其他模块使用
logger = loguru_logger
